/**
 * 123. 买卖股票的最佳时机III
 */
public class Exerciser7 {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int[][] f = new int[n][3];
        int[][] g = new int[n][3];
        int INF = 0x3f3f3f3f;
        for(int j = 0;j < 3;j++) {
            f[0][j] = g[0][j] = -INF;
        }
        f[0][0] = -prices[0];
        g[0][0] = 0;
        for(int i = 1;i < n;i++) {
            for(int j = 0;j < 3;j++) {
                f[i][j] = Math.max(f[i - 1][j],g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if(j - 1 >= 0) {
                    g[i][j] = Math.max(g[i][j],f[i - 1][j - 1] + prices[i]);
                    // 这里因为完成一次卖出，说明 交易次数据需要进行+1，所以在取前一个位置的值的时候需要进行-1
                }
            }

        }
        // 在 g[n - 1][j] 中寻找最大值，可能在0或1或2的交易次数的时候都有可能出现最大值，进行查找
        int ret = 0;
        for(int j = 0;j < 3;j++) {
            ret = Math.max(g[n - 1][j],ret);
        }
        return ret;
    }
}
